package com.tarena.lbs.content.service.impl;

import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.github.pagehelper.PageInfo;
import com.tarena.lbs.base.protocol.pager.PageResult;
import com.tarena.lbs.content.dao.repository.CategoryRepository;
import com.tarena.lbs.content.pojo.po.ArticleCategoryPO;
import com.tarena.lbs.content.pojo.query.ArticleCategoryQuery;
import com.tarena.lbs.content.pojo.vo.ArticleCategoryVO;
import com.tarena.lbs.content.service.CategoryService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

@Service
@Slf4j
public class CategoryServiceImpl implements CategoryService {
    @Autowired
    private CategoryRepository categoryRepository;
    @Override
    public PageResult<ArticleCategoryVO> pageList(ArticleCategoryQuery query) {
        PageInfo<ArticleCategoryPO> pageInfo = categoryRepository.pageList(query);
        //检查非空
        if (pageInfo == null){
            return new PageResult<>();//返回空结果而不是null
        }
        // 创建一个新的分页结果对象，用于存储最终的分页查询结果
        PageResult<ArticleCategoryVO> voPage = new PageResult<>();
        // 将分页信息中的页码设置到分页结果对象中
        voPage.setPageNo(pageInfo.getPageNum());
        // 将分页信息中的每页数量设置到分页结果对象中
        voPage.setPageSize(pageInfo.getPageSize());
        // 将分页信息中的总记录数设置到分页结果对象中
        voPage.setTotal(pageInfo.getTotal());
        // 声明一个存储管理员视图对象的列表
        List<ArticleCategoryVO> vos = null;
        // 从分页信息中获取管理员持久化对象列表
        List<ArticleCategoryPO> pos = pageInfo.getList();
        // 判断持久化对象列表是否不为空
        if (CollectionUtils.isNotEmpty(pos)){
            vos=pos.stream().map(po->{
                ArticleCategoryVO vo = new ArticleCategoryVO();
                BeanUtils.copyProperties(po,vo);
                return vo;
            }).collect(Collectors.toList());
        }
        voPage.setObjects(vos);
        return voPage;
    }

    @Override
    public void categoryAdd(ArticleCategoryVO param) {
        //参数校验
        if (param == null){
            throw new IllegalArgumentException("参数不能为空");
        }
        if (param.getCategoryName() == null || param.getCategoryName().trim().isEmpty()){
            throw new IllegalArgumentException("分类名称不能为空");
        }
        if (param.getSort() == null){
            throw new IllegalArgumentException("排序不能为空");
        }
        //查看分类名称是否存在
        boolean exists = categoryRepository.existsByCategoryName(param.getCategoryName());
        if (exists) {
            throw new RuntimeException("分类名称已存在");
        }
        //创建PO对象并设置对象属性
        ArticleCategoryPO po = new ArticleCategoryPO();
        BeanUtils.copyProperties(param,po);
        //设置默认值和时间
        if (po.getCategoryStatus() == null) {
            po.setCategoryStatus(1); // 默认启用
        }
        Date now = new Date();
        po.setCreateTime(now);
        po.setUpdateTime(now);
        // 5. 调用Repository保存
        try {
            categoryRepository.save(po);
            log.info("新增文章分类成功，分类名称：{}", param.getCategoryName());
        } catch (Exception e) {
            log.error("新增文章分类失败，分类名称：{}", param.getCategoryName(), e);
            throw new RuntimeException("新增分类失败", e);
        }
    }

    @Override
    public void categoryUpdate(ArticleCategoryVO param) {
        //参数校验
        if (param == null || param.getId() == null){
            throw new IllegalArgumentException("参数不能为空");
        }
        //检查分类是否存在
        ArticleCategoryPO existingPO = categoryRepository.getById(param.getId());
        if (existingPO == null){
            throw new RuntimeException("分类不存在");
        }
        //检查修改后的分类名称是否重复
        if (!existingPO.getCategoryName().equals(param.getCategoryName()) && param.getCategoryName() != null){
            boolean exists = categoryRepository.existsByCategoryName(param.getCategoryName());
            if (exists) {
                throw new RuntimeException("分类名称已存在");
            }
        }
        //更新属性
        BeanUtils.copyProperties(param, existingPO, "id", "createTime");
        existingPO.setUpdateTime(new Date());
        //保存更新
        try {
            categoryRepository.save(existingPO);
            log.info("更新文章分类成功，分类名称：{}", param.getCategoryName());
        } catch (Exception e) {
            log.error("更新文章分类失败，分类名称：{}", param.getCategoryName(), e);
            throw new RuntimeException("更新分类失败", e);
        }
    }

    @Override
    public void categoryDel(Integer id) {
        if (id == null) {
            throw new IllegalArgumentException("ID不能为空");
        }
        try {
            categoryRepository.deleteById(id);
            log.info("删除文章分类成功，分类ID：{}", id);
        } catch (Exception e) {
            log.error("删除文章分类失败，分类ID：{}", id, e);
            throw new RuntimeException("删除分类失败", e);
        }
    }
    
    @Override
    public List<ArticleCategoryVO> getAllEnabledCategories() {
        List<ArticleCategoryPO> pos = categoryRepository.getAllEnabledCategories();
        if (CollectionUtils.isNotEmpty(pos)) {
            return pos.stream().map(po -> {
                ArticleCategoryVO vo = new ArticleCategoryVO();
                BeanUtils.copyProperties(po, vo);
                return vo;
            }).collect(Collectors.toList());
        }
        return List.of();
    }
}